package com.example.grafstock_upload;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import org.csi.controle.core.servico.Servico;
import org.csi.controle.core.util.RetornoServico;
import org.csi.controle.upload.dados.Dados;
import org.csi.controle.upload.dados.Envio;
import org.csi.controle.upload.helper.NotificacaoUploadHelper;
import org.csi.controle.upload.listener.TratarRetornoServico;

import android.os.AsyncTask;
import android.util.Log;

public class ServicoAndroid<T> extends AsyncTask<String, Void, Boolean> {

	private RetornoServico<T> retorno;
	
	private static final String TAG = "ServicoAndroid";
	
	public static String TIPO_LOGIN = "LOGIN";
	
	public static String TIPO_ENVIO_FOTO = "TIPO_ENVIO_FOTO";
	
	public static String TIPO_ENVIAR_FOTOS = "TIPO_ENVIAR_FOTOS";
	
	public static String TIPO_OBTER_ID_OS = "TIPO_OBTER_ID_OS";
	
	public static String TIPO_OBTER_PERMISSOES = "TIPO_OBTER_PERMISSOES";
	
	public static String URL_SERVICO = "http://54.186.251.237:8080/controle-admin/services/";
//	public static String URL_SERVICO = "http://192.168.0.6:8080/controle-admin/services/";
	
	private TratarRetornoServico<T> tratarRetorno;
	
	public ServicoAndroid(TratarRetornoServico<T> tratarRetorno) {
		this.tratarRetorno = tratarRetorno;
	}
	
	@Override
	protected Boolean doInBackground(String... params) {
		String tipo = params[0];
		Servico<T> servico = new Servico<T>(URL_SERVICO, Dados.token);
		if(tipo.equals(TIPO_LOGIN)) {
			try {
				retorno = servico.gerarToken(params[1], params[2]);
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else if(tipo.equals(TIPO_ENVIO_FOTO)) {
			try {
				retorno = (RetornoServico<T>) servico.listarEnviosFoto();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else if(tipo.equals(TIPO_OBTER_ID_OS)) {
			try {
				retorno = (RetornoServico<T>) servico.obterIdOriginal(params[1]);
			} catch (Exception e) {
				e.printStackTrace();
			}			
		} else if(tipo.equals(TIPO_ENVIAR_FOTOS)) {
			NotificacaoUploadHelper nuHelp = null;
			try {
				Log.d(TAG, "Registrando envio...");
				Integer idEnvio = servico.registrarEnvio(Integer.parseInt(params[1]), Long.parseLong(params[2]));
				Log.d(TAG, "Envio registrado: "+idEnvio);
				Envio envio = new Envio();
				envio.setIdEnvio(idEnvio);
				envio.setFiles(new ArrayList<File>(Dados.filesTemp));
				Dados.envios.add(envio);
				Dados.filesTemp = new ArrayList<File>();
				Log.d(TAG, "Imagens a enviar: "+envio.getFiles().size());
				int count = 0;
				for (File file : envio.getFiles()) {
					Log.d(TAG, "Imagem["+(count++)+"] : "+file.getPath());					
				}
				nuHelp = new NotificacaoUploadHelper(tratarRetorno.getContext());
				nuHelp.createNotification();
				count = 0;
				for (File file : envio.getFiles()) {
					Log.d(TAG, "Enviando imagem["+count+"]: "+file.getPath());
					servico.enviarFoto(envio.getIdEnvio(), file);
					nuHelp.progressUpdate(count + 1, envio.getFiles().size());
					Log.d(TAG, "Imagem enviada["+count+"]! "+file.getPath());
					Log.d(TAG, "Apagando imagem enviada["+count+"]: "+file.getPath());
					file.delete();
					Log.d(TAG, "Imagem enviada apagada["+count+"]! "+file.getPath());
					count++;
				}
				nuHelp.sucesso(envio.getFiles().size());
				Dados.reset();
			} catch (Exception e) {
				if(nuHelp != null) {
					nuHelp.erro(e.getMessage());
				}
				Log.e(TAG, e.getMessage(), e);
			}			
		} else if(tipo.equals(TIPO_OBTER_PERMISSOES)) {
			try {
				Dados.token = params[1];
				retorno = servico.obterPermissoes(Dados.token);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		tratarRetorno.onRetorno(retorno);
		return true;
	}
	
	@Override
	protected void onPostExecute(Boolean result) {
		if (result) {
			tratarRetorno.onFinish();
		}
	}

	public RetornoServico<T> getRetorno() {
		return retorno;
	}

}